package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import domain.*;

public class AdministradorPersistenciaNumero {
	private static AdministradorPersistenciaNumero pool;

	private AdministradorPersistenciaNumero() {

	}

	public static AdministradorPersistenciaNumero getInstancia() {
		if (pool == null)
			pool = new AdministradorPersistenciaNumero();
		return pool;
	}

	public Numero getNumero(int numeroId) {

		Connection con = PoolConnection.getPoolConnection().getConnection();
		Numero n = null;
		try {

			String senten = "SELECT * from Numeros where NumeroId = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, numeroId);
			ResultSet result = ps.executeQuery();

			while (result.next()) n = mapNumero(result);		

			PoolConnection.getPoolConnection().realeaseConnection(con);

		} catch (SQLException e) {
			System.out.println("Mensaje Error al Borrar Cliente: "
					+ e.getMessage());
			System.out.println("Stack Trace al Borrar Cliente: "
					+ e.getStackTrace());
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
		return n;
	}

	public Vector<Numero> obtenerTodos() {
		Vector<Numero> v = new Vector<Numero>();

		Connection con = PoolConnection.getPoolConnection().getConnection();
		try {

			String senten = "SELECT * from Numeros";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ResultSet result = ps.executeQuery();

			while (result.next()) {
				v.add(mapNumero(result));
			}

			PoolConnection.getPoolConnection().realeaseConnection(con);

		} catch (SQLException e) {
			System.out.println("Mensaje Error al Obtener Numeros: "
					+ e.getMessage());
			System.out.println("Stack Trace al Obtener Numeros: "
					+ e.getStackTrace());
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}
		return v;
	}

	private Numero mapNumero(ResultSet result) throws SQLException {
		return new Numero(result.getInt("NumeroId"), result.getInt("CodPais"),
				result.getInt("CodArea"), result.getBoolean("Disponible"),
				result.getInt("Numero"));
	}

	public void update(Numero n) {
		// Obtener conexion BD
		Connection con = PoolConnection.getPoolConnection().getConnection();

		// Generar sentencia SQL
		try {
			String senten = "UPDATE Numeros set disponible = ?";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setBoolean(1, n.isDisponible());
			int result = ps.executeUpdate();

			PoolConnection.getPoolConnection().realeaseConnection(con);

		} catch (SQLException e) {
			System.out.println("Mensaje Error al Modificar el estado del Numero: "
					+ e.getMessage());
			System.out.println("Stack Trace al Modificar el estado del Numero: "
					+ e.getStackTrace());
			PoolConnection.getPoolConnection().realeaseConnection(con);
		}

	}

}
